package com.xinggq.pay.service.pay.channel.yse.other.refund.dto;

import cn.hutool.core.bean.BeanUtil;
import cn.hutool.core.date.DateUtil;
import cn.hutool.json.JSONUtil;
import com.fasterxml.jackson.annotation.JsonProperty;
import com.xinggq.pay.service.entity.YsePayConfigEntity;
import com.xinggq.pay.service.pay.channel.yse.enums.YseBusinessDic;
import com.xinggq.pay.service.pay.channel.yse.enums.YseMethodEnum;
import com.xinggq.pay.service.pay.channel.yse.utils.YseUtil;
import java.math.BigDecimal;
import lombok.Data;

/**
 * 银盛支付 - 退款参数
 *
 * @author SunW
 */
@Data
public class YseRefundReqDTO {


  /**
   * 接口名称
   */
  @JsonProperty("method")
  private String method;
  /**
   * 在银盛支付开设的服务商商户号，请联系客户经理提供
   */
  @JsonProperty("partner_id")
  private String partnerId;
  /**
   * 发送请求的时间，格式"yyyy-MM-dd HH:mm:ss" 示例值：2014-07-24 03:07:50
   */
  @JsonProperty("timestamp")
  private String timestamp;
  /**
   * 商户网站使用的编码格式，如UTF-8、GBK、GB2312等，默认值 GBK
   */
  @JsonProperty("charset")
  private String charset;
  /**
   * 报文签名算法，RSA/SM
   */
  @JsonProperty("sign_type")
  private String signType;
  /**
   * 签名字符串，再用Base64编码
   */
  @JsonProperty("sign")
  private String sign;
  /**
   * 接口版本3.0 当前版本 3.0
   */
  @JsonProperty("version")
  private String version;
  /**
   * 交易类型，说明：1或者空：即时到账，2：担保交易
   */
  @JsonProperty("notify_url")
  private String notifyUrl;
  /**
   * 业务请求参数的集合，最大长度不限，除公共参数外所有请求参数都必须放在这个参数中传递
   */
  @JsonProperty("biz_content")
  private String bizContent;


  @Data
  public static class BizContent {

    /**
     * 商户原交易订单号, 示例值：201805256843192280647118
     */
    @JsonProperty("out_trade_no")
    private String outTradeNo;
    /**
     * 商户日期(该参数做交易与查询时需要一致) 该日期需在当日的前后一天时间范围之内 示例值：20180525
     */
    @JsonProperty("shopdate")
    private String shopdate;
    /**
     * 退款的原因说明，该参数最长为50个汉字
     */
    @JsonProperty("refund_amount")
    private BigDecimal refundAmount;
    /**
     * 退款的原因说明，该参数最长为50个汉字
     */
    @JsonProperty("refund_reason")
    private String refundReason;
    /**
     * 商户系统生成的退款订单号，标识一次退款请求
     */
    @JsonProperty("out_request_no")
    private String outRequestNo;
    /**
     * 原交易是否参与分账（01或空代表是，02代表否） 示例值：02
     */
    @JsonProperty("is_division")
    private String isDivision;
    /**
     * 原交易分账模式（01：比例，02：金额）
     */
    @JsonProperty("ori_division_mode")
    private String oriDivisionMode;
  }

  public static YseRefundReqDTO buildYseRefundReqDTO(YseRefundParamDTO payParamDto,
      YsePayConfigEntity ysePayConfig) {
    BizContent bizContent = new BizContent();
    bizContent.setOutTradeNo(payParamDto.getPayTradeNo());
    bizContent.setShopdate(DateUtil.now());
    bizContent.setRefundAmount(payParamDto.getRefundAmount());
    bizContent.setRefundReason(payParamDto.getRefundReason());
    bizContent.setOutRequestNo(payParamDto.getChannelTradeNo());
    bizContent.setIsDivision(YseBusinessDic.IsDivision.NO);
    bizContent.setOriDivisionMode(YseBusinessDic.DivisionMode.MONEY);

    YseRefundReqDTO yseRefund = new YseRefundReqDTO();
    yseRefund.setMethod(YseMethodEnum.REFUND_SPLIT.getMethod());
    yseRefund.setPartnerId(ysePayConfig.getPartnerId());
    yseRefund.setTimestamp(DateUtil.now());
    yseRefund.setCharset("UTF-8");
    yseRefund.setSignType("RSA");
    yseRefund.setNotifyUrl(ysePayConfig.getNotifyUrl());
    yseRefund.setVersion(YseMethodEnum.REFUND_SPLIT.getVersion());
    yseRefund.setBizContent(JSONUtil.toJsonStr(BeanUtil.beanToMap(bizContent, true, true)));
    yseRefund.setSign(YseUtil.generateSign(yseRefund, yseRefund.getCharset()));
    return yseRefund;
  }

}
